燕大食堂为了改善学生伙食,新开了一条小吃街。这里共有n个摊位,剁椒鱼头、水煮肉片、牛奶冻、红烧狮子头……各种各样的美食数不胜数,散发着诱人的香气。 SueJane和swoky非常开心地走进小吃街。这里有一条神奇的规定,如果能回答出所有小吃的价格,就可以获得免单的优惠。swoky贿赂了入口处卖可乐鸡翅的大妈,得知了标号为1的摊位(可乐鸡翅)的价格为a_1。此后SueJane和swoky每走到一个摊位,都可以获得一条信息,内容为这个摊位的小吃与另外某一个摊位的差价。现在SueJane和swoky大快朵颐之后来到出口处,发现由于她们吃了太多美食,钱不够了qwq。因此,她们必须猜出所有小吃的价格来获得免单的优惠。你这位神犇能帮她们的忙吗?
输入格式:
输入第一行为三个正整数,为n,m,a_1,分别表示摊位个数、SueJane和swoky获得的信息条数、摊位1的价格。 接下来共有m行,每行包括三个整数x,y,z,表示x摊位的价格比y摊位贵z元钱。
输出格式:
第一行为一个字符串,“QWQ”表示你太强了觉得这个问题非常简单,可以帮她们解决;“QAQ”表示由于SueJane和swoky太蠢了收集到了错误的信息或者没有收集全信息,你对此爱莫能助。 如果第一行输出了"QWQ",那么接下来输出n行每行一个整数,分别表示1~n个摊位的小吃价格。
输入样例1:
在这里给出一组输入。例如:
5 5 10
1 2 3
4 3 2
1 3 2
3 5 1
4 5 3
输出样例1:
在这里给出相应的输出。例如:
QWQ
10
7
8
10
7
输入样例2:
在这里给出一组输入。例如:
5 5 10
1 2 3
4 3 2
1 3 2
3 5 1
4 5 2
输出样例2:
在这里给出相应的输出。例如:
QAQ
输入样例3:
在这里给出一组输入。例如:
5 4 10
4 3 2
1 3 2
3 5 1
4 5 2
输出样例3:
在这里给出相应的输出。例如:
QAQ
样例说明
•样例1中,信息之间不存在矛盾的情况且可以得出所有答案。
•样例2中,第2,4,5条信息互相矛盾。
•样例3中,给出的信息不能够计算出第2个摊位的小吃价格。
数据范围及约定
我的看法
这道题连敲带想花了15min,一开始方向对了,一遍AC,给我很大的成就感。
自我感觉我的方法在网上的博客里算很简单的了,看了一些其他人的AC代码,还是觉得我的思路简单还容易实现。
我的思路
不停遍历所获得的信息,直到遍历了一次,没有再得到新的价格,结束遍历,检验结果,输出正确答案。
还是上代码讲解吧。
#include<iostream>
using namespace std;
int a[100005];//存放价格
struct Ca {
int x, y, difference;
};
int main() {
int n, m;
cin >> n >> m >> a[1];
for (int i = 2; i <= n; i++)a[i] = -1;//除了第一个,别的价钱都不知道,初始化为-1
Ca *prsdf = new Ca[m];
for (int i = 0; i < m; i++)
cin >> prsdf[i].x >> prsdf[i].y >> prsdf[i].difference;
bool havedif = true;//准备开始遍历,如果修改了数组a,那么就是有变化(havedifference)
while (havedif) {
havedif = false;
for (int i = 0; i < m; i++) {//先来俩if,知道一个,不知道另一个,就能根据差价求出另一个
if (a[prsdf[i].x] == -1 && a[prsdf[i].y] != -1) {
a[prsdf[i].x] = a[prsdf[i].y] + prsdf[i].difference;
havedif = true;
}
else if (a[prsdf[i].x] != -1 && a[prsdf[i].y] == -1) {
a[prsdf[i].y]= a[prsdf[i].x]- prsdf[i].difference;
havedif = true;
}
else if (a[prsdf[i].x] != -1 && a[prsdf[i].y] != -1) {//两个都知道,就判断一下是不是没有矛盾
if (a[prsdf[i].x] != (a[prsdf[i].y] + prsdf[i].difference)) {
cout << "QAQ";
goto WANDAN;//有矛盾,不整了,直接goto完蛋
}
}
else continue;//如果都不知道,就跳过
}
}
for (int i = 2; i <= n; i++) {
if (a[i] == -1) {//最后看一下,如果有等于-1的,就是价钱不知道
cout << "QAQ";
goto WANDAN;//不整了,goto完蛋
}
}
cout << "QWQ" << endl;//程序走到这,说明没问题,输出a数组即可
for (int i = 1; i <= n; i++)
cout << a[i] << endl;
WANDAN://完蛋了就直接delete,return
system("pause");
delete[]prsdf;
return 0;
}